clipboard: Add gdk_clipboard_claim_remote()
authorBenjamin Otte <otte@redhat.com>
Sun, 19 Nov 2017 18:18:22 +0000 (19:18 +0100)
committerBenjamin Otte <otte@redhat.com>
Sun, 3 Dec 2017 04:43:24 +0000 (05:43 +0100)
This allows the remote clipboard to take over. The X11 clipboard already
does that.

gdk/gdkclipboard.c
gdk/gdkclipboardprivate.h
gdk/x11/gdkclipboard-x11.c

index caa73540fbfa93aab56ac957c60a2bcf5171c71c..77862dd55b1e34dfb4ad48dd220024c4cfe2aa6f 100644 (file)
@@ -188,6 +188,7 @@ gdk_clipboard_init (GdkClipboard *clipboard)
   GdkClipboardPrivate *priv = gdk_clipboard_get_instance_private (clipboard);
 
   priv->formats = gdk_content_formats_new (NULL, 0);
+  priv->local = TRUE;
 }
 
 /**
@@ -233,3 +234,24 @@ gdk_clipboard_new (GdkDisplay *display)
                        "display", display,
                        NULL);
 }
+
+void
+gdk_clipboard_claim_remote (GdkClipboard      *clipboard,
+                            GdkContentFormats *formats)
+{
+  GdkClipboardPrivate *priv = gdk_clipboard_get_instance_private (clipboard);
+
+  g_return_if_fail (GDK_IS_CLIPBOARD (clipboard));
+  g_return_if_fail (formats != NULL);
+
+  gdk_content_formats_unref (priv->formats);
+  priv->formats = gdk_content_formats_ref (formats);
+  g_object_notify_by_pspec (G_OBJECT (clipboard), properties[PROP_FORMATS]);
+  if (priv->local)
+    {
+      priv->local = FALSE;
+      g_object_notify_by_pspec (G_OBJECT (clipboard), properties[PROP_LOCAL]);
+    }
+
+  g_signal_emit (clipboard, signals[CHANGED], 0);
+}
index ac3f0b88c47efa79620c751d459642bdf39f1917..adc6c0ac025f0280d409bb1240e417788806d7ce 100644 (file)
@@ -45,6 +45,8 @@ struct _GdkClipboardClass
 
 GdkClipboard *          gdk_clipboard_new                       (GdkDisplay             *display);
 
+void                    gdk_clipboard_claim_remote              (GdkClipboard           *clipboard,
+                                                                 GdkContentFormats      *formats);
 
 G_END_DECLS
 
index 4a90d8afb03780824854d728aa6e5f5c6cf8a0b2..eb2f6d1645964d4f4a2c8ea138cf5ba19fb448d2 100644 (file)
@@ -115,9 +115,14 @@ gdk_x11_clipboard_request_targets_finish (GObject      *source_object,
     {
       gdk_content_formats_builder_add_mime_type (builder, gdk_x11_get_xatom_name_for_display (display , atoms[i]));
     }
+  gdk_content_formats_builder_add_formats (builder, gdk_clipboard_get_formats (GDK_CLIPBOARD (cb)));
   formats = gdk_content_formats_builder_free (builder);
   GDK_NOTE(CLIPBOARD, char *s = gdk_content_formats_to_string (formats); g_printerr ("%s: got formats: %s\n", cb->selection, s); g_free (s));
 
+  /* union with previously loaded formats */
+  gdk_clipboard_claim_remote (GDK_CLIPBOARD (cb), formats);
+  gdk_content_formats_unref (formats);
+
   g_input_stream_read_bytes_async (stream,
                                    SELECTION_MAX_SIZE (display),
                                    G_PRIORITY_DEFAULT,